package com.juns.wechat.chat; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.BDNotifyListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BaiduMapOptions; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MapStatus; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.MyLocationConfiguration; import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.utils.CoordinateConverter; import com.juns.wechat.R; import com.juns.wechat.common.Utils; import com.juns.wechat.dialog.FlippingLoadingDialog; public class BaiduMapActivity extends BaseActivity implements OnClickListener { static MapView mMapView = null; FrameLayout mMapViewContainer = null; // 定位相关 LocationClient mLocClient; public MyLocationListenner myListener = new MyLocationListenner(); public NotifyLister mNotifyer = null; private TextView txt_right, txt_title; private ImageView img_back; private EditText indexText = null; private int index = 0; // LocationData locData = null; private static BDLocation lastLocation = null; public static BaiduMapActivity instance = null; // private ProgressDialog progressDialog; private BaiduMap mBaiduMap; private FlippingLoadingDialog mLoadingDialog; private LocationMode mCurrentMode; /** * 构造广播监听类,监听 SDK key 验证以及网络异常广播 */ public class BaiduSDKReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { String s = intent.getAction(); if (s.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) { Toast.makeText(instance, "key 验证出错! 请在 AndroidManifest.xml 文件中检查 key 设置", Toast.LENGTH_SHORT).show(); } else if (s .equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) { Toast.makeText(instance, "网络出错", Toast.LENGTH_SHORT).show(); } } } private BaiduSDKReceiver mBaiduReceiver; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); instance = this; // 在使用SDK各组件之前初始化context信息,传入ApplicationContext // 注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_baidumap); mMapView = (MapView) findViewById(R.id.bmapView); txt_right = (TextView) findViewById(R.id.txt_right); txt_right.setText("发送"); txt_right.setVisibility(View.VISIBLE); txt_title = (TextView) findViewById(R.id.txt_title); txt_title.setText("位置"); img_back = (ImageView) findViewById(R.id.img_back); img_back.setVisibility(View.VISIBLE); Intent intent = getIntent(); double latitude = intent.getDoubleExtra("latitude", 0); mCurrentMode = LocationMode.NORMAL; mBaiduMap = mMapView.getMap(); mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); mBaiduMap.setMyLocationEnabled(true); MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f); mBaiduMap.setMapStatus(msu); initMapView(); if (latitude == 0) { BaiduMapOptions mapoption = new BaiduMapOptions(); mMapView = new MapView(this, mapoption); mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration( mCurrentMode, true, null)); showMapWithLocationClient(); } else { double longtitude = intent.getDoubleExtra("longitude", 0); String address = intent.getStringExtra("address"); LatLng p = new LatLng(latitude, longtitude); mMapView = new MapView(this, new BaiduMapOptions().mapStatus(new MapStatus.Builder() .target(p).build())); showMap(latitude, longtitude, address); } // 注册 SDK 广播监听者 IntentFilter iFilter = new IntentFilter(); iFilter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR); iFilter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR); mBaiduReceiver = new BaiduSDKReceiver(); registerReceiver(mBaiduReceiver, iFilter); initClick(); } private void initClick() { txt_right.setOnClickListener(this); img_back.setOnClickListener(this); } private void showMap(double latitude, double longtitude, String address) { txt_right.setVisibility(View.GONE); LatLng llA = new LatLng(latitude, longtitude); CoordinateConverter converter = new CoordinateConverter(); converter.coord(llA); converter.from(CoordinateConverter.CoordType.COMMON); LatLng convertLatLng = converter.convert(); OverlayOptions ooA = new MarkerOptions() .position(convertLatLng) .icon(BitmapDescriptorFactory .fromResource(R.drawable.icon_marka)).zIndex(4) .draggable(true); mBaiduMap.addOverlay(ooA); MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(convertLatLng, 17.0f); mBaiduMap.animateMapStatus(u); } private void showMapWithLocationClient() { mLoadingDialog = new FlippingLoadingDialog(this, "正在确定你的位置..."); mLoadingDialog.show(); mLocClient = new LocationClient(this); mLocClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);// 打开gps // option.setCoorType("bd09ll"); //设置坐标类型 // Johnson change to use gcj02 coordination. chinese national standard // so need to conver to bd09 everytime when draw on baidu map option.setCoorType("gcj02"); option.setScanSpan(30000); option.setAddrType("all"); mLocClient.setLocOption(option); } @Override protected void onPause() { mMapView.onPause(); if (mLocClient != null) { mLocClient.stop(); } super.onPause(); lastLocation = null; } @Override protected void onResume() { mMapView.onResume(); if (mLocClient != null) { mLocClient.start(); } super.onResume(); } @Override protected void onDestroy() { if (mLocClient != null) mLocClient.stop(); mMapView.onDestroy(); unregisterReceiver(mBaiduReceiver); super.onDestroy(); } private void initMapView() { mMapView.setLongClickable(true); } /** * 监听函数,有新位置的时候,格式化成字符串,输出到屏幕中 */ public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (location == null) { return; } Log.d("map", "On location change received:" + location); Log.d("map", "addr:" + location.getAddrStr()); txt_right.setEnabled(true); if (mLoadingDialog != null) { mLoadingDialog.dismiss(); } if (lastLocation != null) { if (lastLocation.getLatitude() == location.getLatitude() && lastLocation.getLongitude() == location .getLongitude()) { Log.d("map", "same location, skip refresh"); // mMapView.refresh(); //need this refresh? return; } } lastLocation = location; mBaiduMap.clear(); LatLng llA = new LatLng(lastLocation.getLatitude(), lastLocation.getLongitude()); CoordinateConverter converter = new CoordinateConverter(); converter.coord(llA); converter.from(CoordinateConverter.CoordType.COMMON); LatLng convertLatLng = converter.convert(); OverlayOptions ooA = new MarkerOptions() .position(convertLatLng) .icon(BitmapDescriptorFactory .fromResource(R.drawable.icon_marka)).zIndex(2) .draggable(true); mBaiduMap.addOverlay(ooA); MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom( convertLatLng, 17.0f); mBaiduMap.animateMapStatus(u); } public void onReceivePoi(BDLocation poiLocation) { if (poiLocation == null) { return; } } } public class NotifyLister extends BDNotifyListener { public void onNotify(BDLocation mlocation, float distance) { } } public void back(View v) { finish(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.img_back: Utils.finish(BaiduMapActivity.this); break; case R.id.txt_right: if (lastLocation != null) { Intent intent = getIntent(); intent.putExtra("latitude", lastLocation.getLatitude()); intent.putExtra("longitude", lastLocation.getLongitude()); intent.putExtra("address", lastLocation.getAddrStr()); setResult(RESULT_OK, intent); Utils.finish(BaiduMapActivity.this); } break; default: break; } } }